Skip to main content

Loops - (Until, Loop Control va Advanced)

Until Loops

Nazariya

Until tsikli while tsiklining teskarisi - shart false bo'lgunga qadar ishlaydi. Bu ba'zi vaziyatlarda mantiqiy jihatdan aniqroq bo'ladi.

Until vs While:

  • while [ condition ] - shart true bo'lgunga qadar
  • until [ condition ] - shart true bo'lgunga qadar KUTISH

Amaliyot

#!/bin/bash

echo "============================================"
echo " UNTIL LOOPS DEMO"
echo "============================================"

# 1. BASIC UNTIL LOOPS
echo "=== 1. Asosiy Until Tsikllar ==="

# Simple countdown
echo "Oddiy countdown (until bilan):"
counter=5
echo " Countdown:"
until [ $counter -eq 0 ]; do
echo " $counter"
((counter--))
sleep 1
done
echo " 🚀 Launch!"
echo

# Wait for user input
echo "Foydalanuvchi inputini kutish:"
user_ready=false
attempts=0
until [ "$user_ready" = true ] || [ $attempts -ge 3 ]; do
((attempts++))
read -p " Tayyor bo'lganingizda 'yes' yozing (urinish $attempts/3): " response
if [ "$response" = "yes" ]; then
user_ready=true
echo " ✅ Tayyor!"
else
echo " ⏳ Kutilmoqda..."
fi
done

if [ "$user_ready" = false ]; then
echo " ⚠️ Maksimal urinishlar tugadi!"
fi
echo

# Resource availability check
echo "Resurs mavjudligini kutish (simulatsiya):"
resource_available=false
check_count=0

until [ "$resource_available" = true ] || [ $check_count -ge 3 ]; do
((check_count++))
echo " 🔍 Tekshiruv #$check_count..."

# Simulate random availability (60% chance)
if [ $((RANDOM % 10)) -gt 3 ]; then
resource_available=true
echo " ✅ Resurs mavjud!"
else
echo " ❌ Resurs hali mavjud emas, 1 soniya kutilmoqda..."
sleep 1
fi
done

if [ "$resource_available" = false ]; then
echo " ⚠️ Maksimal urinishlar tugadi!"
fi
echo

# 2. SERVICE STARTUP MONITORING
echo "=== 2. Xizmat Ishga Tushirish Monitoring ==="

# Database startup simulation
echo "Database startup kutish:"
db_ready=false
startup_time=0
max_wait=5

echo " 🗄️ Database ishga tushirilmoqda..."

until [ "$db_ready" = true ] || [ $startup_time -ge $max_wait ]; do
((startup_time++))
echo " ⏳ Kutilmoqda... ${startup_time}s"

if [ $startup_time -ge 2 ] && [ $((RANDOM % 10)) -gt 2 ]; then
db_ready=true
echo " ✅ Database tayyor! (${startup_time}s ichida)"
else
sleep 1
fi
done

if [ "$db_ready" = false ]; then
echo " ❌ Database startup timeout! (${max_wait}s)"
fi
echo

# Port availability check
echo "Port mavjudligi tekshiruvi:"
required_ports=(8080 3306 6379)

for port in "${required_ports[@]}"; do
echo " 🔌 Port $port tekshirilmoqda..."

port_available=false
check_attempts=0
max_attempts=3

until [ "$port_available" = true ] || [ $check_attempts -ge $max_attempts ]; do
((check_attempts++))
echo " Urinish #$check_attempts..."

if [ $((RANDOM % 10)) -gt 1 ]; then
port_available=true
echo " ✅ Port $port mavjud!"
else
echo " ❌ Port $port band, kutilmoqda..."
sleep 1
fi
done

if [ "$port_available" = false ]; then
echo " ⚠️ Port $port hali ham band!"
fi
done
echo

# 3. FILE PROCESSING UNTIL COMPLETE
echo "=== 3. Fayl Qayta Ishlash (Until Complete) ==="

# Batch file processor
echo "Batch fayl qayta ishlash:"

# Create sample files to process
mkdir -p processing_queue
for i in {1..5}; do
echo "Sample data $i" > "processing_queue/file_$i.txt"
done

echo " 📁 5 ta fayl yaratildi processing_queue/ da"

processed_count=0
total_files=$(find processing_queue -name "*.txt" | wc -l)

echo " ⚙️ Fayllarni qayta ishlash boshlanmoqda..."

until [ $processed_count -ge $total_files ]; do
# Find next file to process
next_file=$(find processing_queue -name "*.txt" | head -1)

if [ -n "$next_file" ]; then
((processed_count++))
filename=$(basename "$next_file")

echo " 📄 Qayta ishlanmoqda: $filename ($processed_count/$total_files)"

# Simulate processing time
sleep 0.5

# Move to processed folder
mkdir -p processed
mv "$next_file" "processed/"

echo " ✅ Tugallandi: $filename"
else
echo " ⚠️ Qayta ishlanadigan fayl topilmadi!"
break
fi
done

echo " 🎉 Barcha fayllar qayta ishlandi! ($processed_count ta)"
echo

# Cleanup
rm -rf processing_queue processed

# Download completion monitoring
echo "Yuklab olish tugallanishi:"
downloads=("system-update.deb" "backup-data.tar.gz")

for download in "${downloads[@]}"; do
echo " 📥 $download yuklab olish monitoring:"

download_complete=false
progress=0
target_size=$((RANDOM % 100 + 50))

until [ "$download_complete" = true ]; do
increment=$((RANDOM % 10 + 5))
progress=$((progress + increment))

if [ $progress -ge $target_size ]; then
progress=$target_size
download_complete=true
fi

percentage=$((progress * 100 / target_size))
printf " Progress: %3d%% (%d/%d MB)\r" $percentage $progress $target_size

if [ "$download_complete" = false ]; then
sleep 0.3
fi
done

echo
echo " ✅ $download muvaffaqiyatli yuklab olindi!"
echo
done

Loop Control

Nazariya

Loop control operatorlari tsikl oqimini boshqarish uchun ishlatiladi:

  • break - tsiklni butunlay to'xtatadi
  • continue - joriy iteratsiyani o'tkazib, keyingisiga o'tadi
  • break n - n ta ichki tsikldan chiqadi
  • continue n - n ta ichki tsiklda keyingi iteratsiyaga o'tadi

Amaliyot

#!/bin/bash

echo "============================================"
echo " LOOP CONTROL DEMO"
echo "============================================"

# 1. BASIC BREAK AND CONTINUE
echo "=== 1. Asosiy Break va Continue ==="

# Break example
echo "Break misoli (birinchi juft raqamni topganda to'xtash):"
echo -n " Raqamlar: "
for i in {1..10}; do
echo -n "$i "
if [ $((i % 2)) -eq 0 ]; then
echo
echo " ✅ Birinchi juft raqam topildi: $i"
echo " 🛑 Tsikl to'xtatildi"
break
fi
done
echo

# Continue example
echo "Continue misoli (faqat toq raqamlarni ko'rsatish):"
echo -n " Toq raqamlar: "
for i in {1..10}; do
if [ $((i % 2)) -eq 0 ]; then
continue # Skip even numbers
fi
echo -n "$i "
done
echo -e "\n"

# Practical search example
echo "Amaliy qidiruv misoli:"
users=("ahmad" "dilshod" "madina" "jasur" "zarina")
search_user="madina"
found=false

echo " 👤 Foydalanuvchi qidirilmoqda: $search_user"

for user in "${users[@]}"; do
echo " Tekshirilmoqda: $user"
if [ "$user" = "$search_user" ]; then
echo " ✅ Topildi: $user"
found=true
break
fi
done

if [ "$found" = false ]; then
echo " ❌ Topilmadi: $search_user"
fi
echo

# Skip processing certain items
echo "Ma'lum elementlarni o'tkazib yuborish:"
items=("item1" "SKIP" "item2" "ERROR" "item3" "item4")

echo " 📦 Elementlar qayta ishlanmoqda:"
processed=0

for item in "${items[@]}"; do
echo " 📄 Tekshirilmoqda: $item"

# Skip certain items
if [[ "$item" == "SKIP" || "$item" == "ERROR" ]]; then
echo " ⏭️ O'tkazib yuborildi: $item"
continue
fi

# Process normal item
echo " ✅ Qayta ishlandi: $item"
((processed++))
done

echo " 📊 Jami qayta ishlandi: $processed ta element"
echo

# 2. NESTED LOOP CONTROL
echo "=== 2. Ichma-ich Tsikl Boshqaruvi ==="

# Simple nested loops with break
echo "Oddiy ichma-ich tsikllar (break):"
echo " Ko'paytirish jadvalida 50 dan katta birinchi qiymatni topish:"

found_value=false
for i in {1..10}; do
echo -n " $i qatori: "
for j in {1..10}; do
product=$((i * j))
echo -n "$product "

if [ $product -gt 50 ]; then
echo
echo " ✅ 50 dan katta qiymat topildi: $i x $j = $product"
found_value=true
break 2 # Break from both loops
fi
done

if [ "$found_value" = true ]; then
break
fi
echo
done
echo

# Matrix processing with continue
echo "Matrix qayta ishlash (continue):"
echo " 3x3 matrix, diagonal elementlarni o'tkazib yuborish:"

for ((i=1; i<=3; i++)); do
echo -n " Qator $i: "
for ((j=1; j<=3; j++)); do
if [ $i -eq $j ]; then
echo -n "X " # Skip diagonal
continue
fi
echo -n "[$i,$j] "
done
echo
done
echo

# 3. ERROR HANDLING WITH LOOP CONTROL
echo "=== 3. Xato Bilan Ishlash (Loop Control) ==="

# File processing with error handling
echo "Fayl qayta ishlash (xato bilan ishlash):"

# Create test files (some will have "errors")
mkdir -p error_test
echo "valid data 1" > error_test/file1.txt
echo "ERROR: corrupted" > error_test/file2.txt
echo "valid data 2" > error_test/file3.txt
echo "" > error_test/file4.txt # Empty file
echo "valid data 3" > error_test/file5.txt

processed_count=0
error_count=0
max_errors=2

echo " 📁 Fayllar qayta ishlanmoqda..."

for file in error_test/*.txt; do
filename=$(basename "$file")
echo " 📄 Qayta ishlanmoqda: $filename"

# Check if file is empty
if [ ! -s "$file" ]; then
echo " ⚠️ Bo'sh fayl o'tkazib yuborildi"
continue
fi

# Check for error content
if grep -q "ERROR" "$file"; then
((error_count++))
echo " ❌ Xato topildi! ($error_count/$max_errors)"

if [ $error_count -ge $max_errors ]; then
echo " 🛑 Maksimal xato soni yetdi, to'xtatilmoqda!"
break
fi
continue
fi

# Process valid file
((processed_count++))
content=$(cat "$file")
echo " ✅ Muvaffaqiyatli: '$content'"
done

echo " 📊 Natijalar:"
echo " Qayta ishlandi: $processed_count ta fayl"
echo " Xatolar: $error_count ta"
echo

# Network retry mechanism
echo "Network retry mexanizmi:"

servers=("server1.com" "server2.com" "server3.com")
max_retries=3
successful_connections=0

for server in "${servers[@]}"; do
echo " 🌐 Ulanish: $server"
connected=false
retry_count=0

while [ $retry_count -lt $max_retries ]; do
((retry_count++))
echo " Urinish #$retry_count..."

# Simulate connection (60% success rate)
if [ $((RANDOM % 10)) -gt 3 ]; then
echo " ✅ Muvaffaqiyatli ulanish!"
connected=true
((successful_connections++))
break
else
echo " ❌ Ulanish muvaffaqiyatsiz"
if [ $retry_count -lt $max_retries ]; then
echo " ⏳ 1 soniya kutish..."
sleep 1
fi
fi
done

if [ "$connected" = false ]; then
echo " 💀 $server ga ulanib bo'lmadi ($max_retries urinish)"
fi
echo
done

echo " 📊 Ulanish natijalari:"
echo " Muvaffaqiyatli: $successful_connections/${#servers[@]}"
echo

# Cleanup
rm -rf error_test

# 4. ADVANCED CONTROL PATTERNS
echo "=== 4. Murakkab Control Naqshlari ==="

# State machine simulation
echo "State machine simulatsiyasi:"

states=("INIT" "LOADING" "READY" "PROCESSING" "ERROR" "SHUTDOWN")
current_state="INIT"
state_count=0
max_states=8

echo " 🔄 State machine ishga tushirilmoqda..."

while [ $state_count -lt $max_states ]; do
((state_count++))
echo " State #$state_count: $current_state"

case "$current_state" in
"INIT")
echo " 🏁 Tizim ishga tushirilmoqda..."
current_state="LOADING"
;;
"LOADING")
echo " 📥 Ma'lumotlar yuklanmoqda..."
# Simulate loading (80% success)
if [ $((RANDOM % 10)) -gt 1 ]; then
current_state="READY"
else
current_state="ERROR"
fi
;;
"READY")
echo " ✅ Tizim tayyor"
current_state="PROCESSING"
;;
"PROCESSING")
echo " ⚙️ Ma'lumotlar qayta ishlanmoqda..."
# Simulate processing (70% success)
if [ $((RANDOM % 10)) -gt 2 ]; then
current_state="READY"
else
current_state="ERROR"
fi
;;
"ERROR")
echo " ❌ Xato holati!"
echo " 🔧 Tizim tiklash..."
current_state="INIT"
;;
"SHUTDOWN")
echo " 🔴 Tizim o'chirilmoqda..."
break
;;
esac

# Random shutdown
if [ $state_count -gt 5 ] && [ $((RANDOM % 10)) -eq 0 ]; then
current_state="SHUTDOWN"
fi

sleep 0.3
done

echo " 🏁 State machine to'xtatildi: $current_state"
echo

# Load balancer simulation
echo "Load balancer simulatsiyasi:"

servers=("server1" "server2" "server3")
server_loads=(0 0 0) # Current load for each server
max_load=5
requests=12

echo " ⚖️ Load balancing ($requests ta request):"

for ((request=1; request<=requests; request++)); do
echo " Request #$request:"

assigned=false

# Try to assign to least loaded server
for ((i=0; i<${#servers[@]}; i++)); do
if [ ${server_loads[i]} -lt $max_load ]; then
echo " ➡️ ${servers[i]} ga tayinlandi (load: ${server_loads[i]}/$max_load)"
server_loads[i]=$((server_loads[i] + 1))
assigned=true
break
fi
done

if [ "$assigned" = false ]; then
echo " ❌ Barcha serverlar band! Request rad etildi."
continue
fi

# Randomly complete some requests
for ((i=0; i<${#servers[@]}; i++)); do
if [ ${server_loads[i]} -gt 0 ] && [ $((RANDOM % 3)) -eq 0 ]; then
server_loads[i]=$((server_loads[i] - 1))
echo " ✅ ${servers[i]} request tugalladi (load: ${server_loads[i]}/$max_load)"
fi
done

sleep 0.2
done

echo " 📊 Yakuniy server loadlari:"
for ((i=0; i<${#servers[@]}; i++)); do
echo " ${servers[i]}: ${server_loads[i]}/$max_load"
done
echo

# 5. DATA PROCESSING PIPELINE
echo "=== 5. Ma'lumot Qayta Ishlash Pipeline ==="

# Pipeline processor
echo "Pipeline qayta ishlash:"

pipeline_stages=("INPUT" "VALIDATE" "TRANSFORM" "OUTPUT")
items=("item1" "item2" "item3" "item4" "item5")

echo " 🏭 Pipeline qayta ishlash:"

for item in "${items[@]}"; do
echo " 📦 Processing: $item"
pipeline_failed=false

for stage in "${pipeline_stages[@]}"; do
echo " $stage stage..."

# Simulate stage processing
case "$stage" in
"INPUT")
echo " 📥 Ma'lumot qabul qilindi"
;;
"VALIDATE")
# 10% validation failure
if [ $((RANDOM % 10)) -eq 0 ]; then
echo " ❌ Validatsiya muvaffaqiyatsiz!"
pipeline_failed=true
break
else
echo " ✅ Validatsiya muvaffaqiyatli"
fi
;;
"TRANSFORM")
# 5% transformation failure
if [ $((RANDOM % 20)) -eq 0 ]; then
echo " ❌ Transformatsiya muvaffaqiyatsiz!"
pipeline_failed=true
break
else
echo " 🔄 Ma'lumot transformatsiya qilindi"
fi
;;
"OUTPUT")
echo " 📤 Ma'lumot chiqarildi"
;;
esac

sleep 0.1
done

if [ "$pipeline_failed" = true ]; then
echo " 💀 $item pipeline muvaffaqiyatsiz!"
else
echo " 🎉 $item muvaffaqiyatli qayta ishlandi!"
fi
echo
done

# 6. COMPREHENSIVE EXAMPLE
echo "=== 6. Keng Qamrovli Misol ==="

# Log analyzer with all loop types
echo "Log analyzer (barcha tsikl turlari bilan):"

# Create sample log file
cat > comprehensive.log << 'EOF'
2024-06-24 10:15:23 INFO User login: admin
2024-06-24 10:16:45 ERROR Database connection failed
2024-06-24 10:17:12 INFO User login: user123
2024-06-24 10:18:33 WARN Memory usage high: 85%
2024-06-24 10:19:44 INFO File uploaded: document.pdf
2024-06-24 10:20:15 ERROR File not found: missing.txt
2024-06-24 10:21:26 INFO User logout: admin
2024-06-24 10:22:37 WARN Disk space low: 5GB remaining
2024-06-24 10:23:45 ERROR Authentication failed
2024-06-24 10:24:12 INFO Backup completed
EOF

echo " 📝 Log fayl yaratildi: comprehensive.log"

# Analyze log levels with for loop
echo " 📊 Log level statistikasi (for loop):"
declare -A log_counts
log_counts[INFO]=0
log_counts[ERROR]=0
log_counts[WARN]=0

for level in INFO ERROR WARN; do
count=$(grep -c "$level" comprehensive.log)
log_counts[$level]=$count
echo " $level: $count ta"
done
echo

# Find critical errors with while loop
echo " 🚨 Kritik xatolar (while loop):"
while IFS= read -r line; do
if [[ "$line" =~ ERROR ]]; then
timestamp=$(echo "$line" | cut -d' ' -f1-2)
message=$(echo "$line" | cut -d' ' -f4-)
echo " [$timestamp] $message"
fi
done < comprehensive.log
echo

# Monitor for new entries with until loop
echo " 👀 Yangi log entry kutish (until simulation):"
original_size=$(wc -l < comprehensive.log)
new_entries_found=false
wait_time=0

# Simulate adding new log entry
(sleep 2 && echo "2024-06-24 10:25:00 INFO New entry added" >> comprehensive.log) &

until [ "$new_entries_found" = true ] || [ $wait_time -ge 5 ]; do
((wait_time++))
current_size=$(wc -l < comprehensive.log)

if [ $current_size -gt $original_size ]; then
new_entries_found=true
echo " ✅ Yangi entry topildi!"
tail -1 comprehensive.log | while read -r new_line; do
echo " 📄 $new_line"
done
else
echo " ⏳ Kutilmoqda... ${wait_time}s"
sleep 1
fi
done

if [ "$new_entries_found" = false ]; then
echo " ⚠️ Yangi entry topilmadi"
fi

# Cleanup
rm -f comprehensive.log

echo
echo "============================================"
echo " BARCHA TSIKL TURLARI TUGADI"
echo "============================================"